package  main.java.leetcode.editor.cn;
//2023-03-09 19:57:27
//给定一个非空的字符串 s ，检查是否可以通过由它的一个子串重复多次构成。 
//
// 
//
// 示例 1: 
//
// 
//输入: s = "abab"
//输出: true
//解释: 可由子串 "ab" 重复两次构成。
// 
//
// 示例 2: 
//
// 
//输入: s = "aba"
//输出: false
// 
//
// 示例 3: 
//
// 
//输入: s = "abcabcabcabc"
//输出: true
//解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
// 
//
// 
//
// 提示： 
//
// 
//
// 
// 1 <= s.length <= 10⁴ 
// s 由小写英文字母组成 
// 
// Related Topics 字符串 字符串匹配 👍 902 👎 0

import java.util.Arrays;

class RepeatedSubstringPattern {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        Solution solution = new RepeatedSubstringPattern().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        s.indexOf(s,1);
        int len = s.length();
        if(len == 0){
            return false;
        }

        int[] next = new int[len];
        Arrays.fill(next,-1);
        int[] newNext = getNext(s,next);

        if(newNext[len-1]!=-1 && len % (len-(newNext[len-1]+1)) == 0){
            return true;
        }
        return false;
    }
    public int[] getNext(String s,int[] next){

        for(int i = 1;i<s.length();i++){
            int j = next[i-1];
            while (j>=0 && s.charAt(i) != s.charAt(j+1)){
                j = next[j];
            }
            if (s.charAt(i) == s.charAt(j+1)){
                next[i] = j+1;
            }
        }
        return next;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
